/*     */ package dm.jdbc.driver;
/*     */ 
/*     */ import dm.jdbc.dataConvertion.Convertion;
/*     */ import dm.jdbc.dbaccess.Const;
/*     */ import dm.jdbc.dbaccess.DBError;
/*     */ import dm.jdbc.desc.LobDesc;
/*     */ import dm.jdbc.innerData.DmdbConnAgent;
/*     */ import dm.jdbc.util.Comparison;
/*     */ import java.io.InputStream;
/*     */ import java.io.OutputStream;
/*     */ import java.io.Reader;
/*     */ import java.sql.Blob;
/*     */ import java.sql.SQLException;
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ public class DmdbBlob
/*     */   extends DmdbLob
/*     */   implements Blob
/*     */ {
/*     */   public DmdbBlob(byte[] bs, DmdbConnection_bs conn)
/*     */     throws SQLException
/*     */   {
/*  58 */     super(bs, conn);
/*     */   }
/*     */   
/*     */   public DmdbBlob(byte[] value, LobDesc lobDesc, DmdbConnection_bs conn, boolean updAble)
/*     */   {
/*  63 */     super(value, (byte)0, lobDesc, conn, updAble);
/*     */   }
/*     */   
/*     */   public DmdbBlob(DmdbConnAgent rConn) {
/*  67 */     super(null, rConn.getRealConn());
/*     */   }
/*     */   
/*     */   public static DmdbBlob getEmptyBlob()
/*     */   {
/*  72 */     return new DmdbBlob(new DmdbConnAgent(new DmdbConnection_bs()));
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   public long length()
/*     */     throws SQLException
/*     */   {
/*  93 */     checkFreed();
/*     */     
/*  95 */     if (Const.TRACE_LEVEL > 0) {
/*  96 */       DmdbLog.trace(this, "length()", "");
/*     */     }
/*     */     
/*  99 */     if (this.m_lobMode == 2) {
/* 100 */       long len = this.m_value.length - this.m_hdr_size;
/* 101 */       if (len < 0L) {
/* 102 */         DBError.throwSQLException(6057);
/*     */       }
/* 104 */       return len;
/*     */     }
/*     */     
/*     */ 
/* 108 */     if ((this.fromRowSetFlag) || (!this.m_updatAble) || 
/* 109 */       (isValueInRow())) {
/* 110 */       return getLobLen();
/*     */     }
/*     */     
/* 113 */     if (this.offRowLen == -1L) {
/* 114 */       checkConnClosed();
/* 115 */       long len = DmdbCSI.lob_get_len(this);
/*     */       
/* 117 */       if (len < 0L) {
/* 118 */         DBError.throwSQLException(6057);
/*     */       }
/* 120 */       this.offRowLen = len;
/*     */       
/* 122 */       return len;
/*     */     }
/* 124 */     return this.offRowLen;
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   public byte[] getBytes(long pos, int length)
/*     */     throws SQLException
/*     */   {
/* 160 */     checkFreed();
/* 161 */     if ((pos <= 0L) || (length < 0)) {
/* 162 */       DBError.throwSQLException(6057);
/*     */     }
/* 164 */     if (Const.TRACE_LEVEL > 0) {
/* 165 */       DmdbLog.trace(this, "getBytes(long, int)", "pos = " + pos + 
/* 166 */         ", length = " + length);
/*     */     }
/*     */     
/* 169 */     byte[] buf = new byte[length];
/*     */     
/* 171 */     if (this.m_lobMode == 2) {
/* 172 */       if (pos > this.m_value.length - this.m_hdr_size) {
/* 173 */         return null;
/*     */       }
/* 175 */       if (this.m_value.length - this.m_hdr_size - pos + 1L < length) {
/* 176 */         buf = new byte[(int)(this.m_value.length - this.m_hdr_size - pos + 1L)];
/*     */       }
/* 178 */       System.arraycopy(this.m_value, (int)pos - 1 + this.m_hdr_size, buf, 0, 
/* 179 */         buf.length);
/*     */       
/* 181 */       return buf;
/*     */     }
/*     */     
/*     */ 
/* 185 */     if (isValueInRow()) {
/* 186 */       byte[] val = getValueInRow();
/*     */       
/* 188 */       if (pos > val.length) {
/* 189 */         if ((this.m_conn != null) && (this.m_conn.getComOra())) {
/* 190 */           return new byte[0];
/*     */         }
/* 192 */         return null;
/*     */       }
/* 194 */       if (val.length - pos + 1L < length) {
/* 195 */         buf = new byte[(int)(val.length - pos + 1L)];
/*     */       }
/* 197 */       System.arraycopy(val, (int)pos - 1, buf, 0, buf.length);
/*     */       
/* 199 */       return buf;
/*     */     }
/*     */     
/* 202 */     if (this.fromRowSetFlag) {
/* 203 */       DBError.throwUnsupportedSQLException();
/* 204 */       return null;
/*     */     }
/*     */     
/* 207 */     return getBytesOffRow(pos, length);
/*     */   }
/*     */   
/*     */   public byte[] getBytesOffRow(long pos, int length) throws SQLException
/*     */   {
/* 212 */     checkFreed();
/* 213 */     if ((pos <= 0L) || (length < 0)) {
/* 214 */       DBError.throwSQLException(6057);
/*     */     }
/*     */     
/* 217 */     byte[] tmpBuf = null;
/* 218 */     byte[] buf = new byte[length];
/*     */     int len;
/*     */     int len;
/* 221 */     if (length > 32000) {
/* 222 */       len = 32000;
/*     */     } else {
/* 224 */       len = length;
/*     */     }
/* 226 */     int position = (int)pos - 1;
/* 227 */     int bytesGet = 0;
/*     */     for (;;) {
/* 229 */       checkConnClosed();
/* 230 */       tmpBuf = 
/* 231 */         DmdbCSI.lob_get_bytes(this, (byte)0, position, len);
/* 232 */       if (tmpBuf == null) {
/*     */         break;
/*     */       }
/*     */       
/* 236 */       System.arraycopy(tmpBuf, 0, buf, bytesGet, tmpBuf.length);
/*     */       
/* 238 */       position += tmpBuf.length;
/* 239 */       bytesGet += tmpBuf.length;
/*     */       
/*     */ 
/* 242 */       len = length - bytesGet;
/* 243 */       if (len <= 0) {
/*     */         break;
/*     */       }
/* 246 */       if (len > 32000) {
/* 247 */         len = 32000;
/*     */       }
/*     */     }
/*     */     
/* 251 */     if (bytesGet == length) {
/* 252 */       return buf;
/*     */     }
/* 254 */     byte[] tmpVal = new byte[bytesGet];
/* 255 */     System.arraycopy(buf, 0, tmpVal, 0, bytesGet);
/*     */     
/* 257 */     return tmpVal;
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   public InputStream getBinaryStream()
/*     */     throws SQLException
/*     */   {
/* 279 */     checkFreed();
/* 280 */     if (Const.TRACE_LEVEL > 0) {
/* 281 */       DmdbLog.trace(this, "getBinaryStream()", "");
/*     */     }
/*     */     
/* 284 */     return new DmdbInputStream(this, this.fromRowSetFlag, null);
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   public long position(byte[] pattern, long start)
/*     */     throws SQLException
/*     */   {
/* 315 */     checkFreed();
/* 316 */     if ((this.fromRowSetFlag) || (start < 1L)) {
/* 317 */       DBError.throwSQLException(6057);
/*     */     }
/* 319 */     String pat = null;
/* 320 */     if (pattern != null)
/* 321 */       pat = new String(pattern);
/* 322 */     if (Const.TRACE_LEVEL > 0) {
/* 323 */       DmdbLog.trace(this, "position(byte[], long)", "pattern = " + pat + 
/* 324 */         ", start = " + start);
/*     */     }
/*     */     
/* 327 */     int length = (int)length();
/*     */     
/* 329 */     if (pattern.length > length - start + 1L) {
/* 330 */       return -1L;
/*     */     }
/*     */     
/* 333 */     byte[] bs = getBytes(start, length);
/*     */     
/* 335 */     long ret = Comparison.getIndexOfByteArray(pattern, bs);
/*     */     
/* 337 */     if (ret >= 0L) {
/* 338 */       ret += 1L;
/*     */     }
/*     */     
/* 341 */     return ret;
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   public long position(Blob pattern, long start)
/*     */     throws SQLException
/*     */   {
/* 372 */     checkFreed();
/*     */     
/* 374 */     String pat = null;
/* 375 */     if (pattern != null)
/* 376 */       pat = new String(pattern.getBytes(1L, (int)pattern.length()));
/* 377 */     if (Const.TRACE_LEVEL > 0) {
/* 378 */       DmdbLog.trace(this, "position(Blob, long)", "pattern = " + pat + 
/* 379 */         ", start = " + start);
/*     */     }
/*     */     
/* 382 */     if ((this.fromRowSetFlag) || (pattern == null)) {
/* 383 */       return -1L;
/*     */     }
/* 385 */     if (start < 1L) {
/* 386 */       DBError.throwSQLException(6057);
/*     */     }
/* 388 */     int length = (int)length();
/*     */     
/* 390 */     if (pattern.length() > length - start + 1L) {
/* 391 */       return -1L;
/*     */     }
/*     */     
/* 394 */     byte[] bytes = pattern.getBytes(1L, (int)pattern.length());
/*     */     
/* 396 */     return position(bytes, start);
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   public int setBytes(long pos, byte[] bytes)
/*     */     throws SQLException
/*     */   {
/* 431 */     checkFreed();
/* 432 */     return setBytes(pos, bytes, 0, bytes.length);
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   public int setBytes(long pos, byte[] bytes, int offset, int len)
/*     */     throws SQLException
/*     */   {
/* 477 */     checkFreed();
/* 478 */     if ((pos <= 0L) || (len < 0) || (offset < 0)) {
/* 479 */       DBError.throwSQLException(6057);
/*     */     }
/* 481 */     if ((!this.fromRowSetFlag) && (!this.m_updatAble)) {
/* 482 */       DBError.throwSQLException(6029);
/*     */     }
/* 484 */     if (offset < 0) {
/* 485 */       throw new IndexOutOfBoundsException(
/* 486 */         new Integer(offset).toString());
/*     */     }
/* 488 */     if (len < 0) {
/* 489 */       throw new IndexOutOfBoundsException(new Integer(len).toString());
/*     */     }
/* 491 */     if (offset + len > bytes.length) {
/* 492 */       throw new IndexOutOfBoundsException(
/* 493 */         new Integer(offset + len).toString());
/*     */     }
/* 495 */     String pat = null;
/* 496 */     if (bytes != null)
/* 497 */       pat = new String(bytes);
/* 498 */     if (Const.TRACE_LEVEL > 0) {
/* 499 */       DmdbLog.trace(this, "setBytes(long, byte[], int, int)", "pos = " + 
/* 500 */         pos + ", bytes = " + pat + ", offset = " + offset + 
/* 501 */         ", len = " + len);
/*     */     }
/*     */     
/*     */ 
/*     */ 
/*     */ 
/* 507 */     if (this.m_lobMode == 2) {
/* 508 */       setBlobInRow(pos, bytes, offset, len);
/* 509 */       return len;
/*     */     }
/*     */     
/* 512 */     if (this.fromRowSetFlag) {
/* 513 */       setBlobInRow(pos, bytes, offset, len);
/* 514 */       return len;
/*     */     }
/*     */     
/* 517 */     int position = (int)pos - 1;
/* 518 */     int off = offset;
/*     */     int length;
/* 520 */     int length; if (len > 16000) {
/* 521 */       length = 16000;
/*     */     } else {
/* 523 */       length = len;
/*     */     }
/*     */     
/* 526 */     int count = len / 16000 + 1;
/*     */     
/* 528 */     int ret = 0;
/* 529 */     byte firstOrLast = 0;
/* 530 */     for (int i = 0; i < count; i++) {
/* 531 */       if ((i == 0) && (i == count - 1)) {
/* 532 */         firstOrLast = 3;
/* 533 */       } else if (i == 0) {
/* 534 */         firstOrLast = 1;
/* 535 */       } else if (i == count - 1) {
/* 536 */         firstOrLast = 2;
/*     */       } else {
/* 538 */         firstOrLast = 0;
/*     */       }
/* 540 */       checkConnClosed();
/* 541 */       int tmp = DmdbCSI.lob_set_bytes(this, (byte)0, position, bytes, 
/* 542 */         off, length, firstOrLast);
/*     */       
/* 544 */       if (tmp <= 0) {
/* 545 */         return ret;
/*     */       }
/* 547 */       ret += tmp;
/*     */       
/*     */ 
/* 550 */       position += length;
/* 551 */       off += length;
/*     */       
/* 553 */       if (i == count - 2) {
/* 554 */         length = len - (i + 1) * 16000;
/*     */       } else {
/* 556 */         length = 16000;
/*     */       }
/*     */     }
/*     */     
/* 560 */     short groupid = Convertion.getShort(getLobLocator().m_data_groupId, 0);
/* 561 */     if (groupid == -1)
/*     */     {
/* 563 */       setBlobInRow(pos, bytes, offset, len);
/*     */     } else {
/* 565 */       this.m_value[0] = 2;
/* 566 */       this.offRowLen = -1L;
/*     */     }
/*     */     
/* 569 */     this.isUpdated = true;
/* 570 */     return ret;
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   public OutputStream setBinaryStream(long pos)
/*     */     throws SQLException
/*     */   {
/* 598 */     checkFreed();
/* 599 */     if ((this.m_conn != null) && 
/* 600 */       (this.m_conn.getComOra()) && (pos == 0L)) {
/* 601 */       pos = 1L;
/*     */     }
/*     */     
/* 604 */     if (pos <= 0L) {
/* 605 */       DBError.throwSQLException(6057);
/*     */     }
/* 607 */     if (Const.TRACE_LEVEL > 0) {
/* 608 */       DmdbLog.trace(this, "setBinaryStream(long)", "pos = " + pos);
/*     */     }
/*     */     
/* 611 */     return new DmdbOutputStream(this, pos);
/*     */   }
/*     */   
/*     */   /**
/*     */    * @deprecated
/*     */    */
/* 617 */   public OutputStream getBinaryOutputStream() throws SQLException { return setBinaryStream(1L); }
/*     */   
/*     */   /**
/*     */    * @deprecated
/*     */    */
/*     */   public OutputStream getBinaryOutputStream(long pos) throws SQLException {
/* 623 */     return setBinaryStream(pos);
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   public void truncate(long len)
/*     */     throws SQLException
/*     */   {
/* 647 */     checkFreed();
/* 648 */     if (len < 0L) {
/* 649 */       DBError.throwSQLException(6057);
/*     */     }
/* 651 */     if (Const.TRACE_LEVEL > 0) {
/* 652 */       DmdbLog.trace(this, "truncate(long)", "len = " + len);
/*     */     }
/*     */     
/* 655 */     if (this.m_lobMode == 2) {
/* 656 */       byte[] tmp = new byte[(int)len + this.m_hdr_size];
/* 657 */       System.arraycopy(this.m_value, 0, tmp, 0, (int)len + this.m_hdr_size);
/* 658 */       this.m_value = tmp;
/* 659 */       this.isUpdated = true;
/* 660 */       return;
/*     */     }
/*     */     
/* 663 */     if ((this.fromRowSetFlag) || (!this.m_updatAble)) {
/* 664 */       DBError.throwSQLException(6029);
/*     */     }
/*     */     
/* 667 */     checkConnClosed();
/* 668 */     DmdbCSI.blob_text_truncate(this, (byte)0, (int)len);
/*     */     
/* 670 */     short groupid = Convertion.getShort(getLobLocator().m_data_groupId, 0);
/* 671 */     if (groupid == -1)
/*     */     {
/* 673 */       byte[] tmp = new byte[(int)(this.m_hdr_size + len)];
/* 674 */       System.arraycopy(this.m_value, 0, tmp, 0, tmp.length);
/* 675 */       Convertion.setInt(tmp, 9, (int)len);
/* 676 */       this.m_value = tmp;
/*     */     } else {
/* 678 */       this.offRowLen = len;
/*     */     }
/* 680 */     this.isUpdated = true;
/*     */   }
/*     */   
/*     */   public Reader getCharacterStream() throws SQLException
/*     */   {
/* 685 */     checkFreed();
/* 686 */     if (Const.TRACE_LEVEL > 0) {
/* 687 */       DmdbLog.trace(this, "getCharacterStream()", "");
/*     */     }
/*     */     
/* 690 */     return new DmdbReader(this);
/*     */   }
/*     */   
/*     */   private void setBlobInRow(long pos, byte[] bytes, int offset, int len) {
/* 694 */     int length = getLobLen();
/* 695 */     this.m_value[0] = 1;
/*     */     
/* 697 */     if (pos > length + 1) {
/* 698 */       throw new IndexOutOfBoundsException(new Long(pos).toString());
/*     */     }
/* 700 */     if (pos + len <= length) {
/* 701 */       System.arraycopy(bytes, offset, this.m_value, 
/* 702 */         (int)(this.m_hdr_size + pos - 1L), len);
/*     */     } else {
/* 704 */       length = (int)(pos + len - 1L);
/* 705 */       Convertion.setInt(this.m_value, 9, length);
/* 706 */       byte[] tmp = new byte[this.m_hdr_size + length];
/* 707 */       System.arraycopy(this.m_value, 0, tmp, 0, this.m_value.length);
/* 708 */       this.m_value = tmp;
/* 709 */       System.arraycopy(bytes, offset, this.m_value, 
/* 710 */         (int)(this.m_hdr_size + pos - 1L), len);
/*     */     }
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   public void free()
/*     */     throws SQLException
/*     */   {
/* 726 */     if (Const.TRACE_LEVEL > 0) {
/* 727 */       DmdbLog.trace(this, "free()", "");
/*     */     }
/*     */     
/* 730 */     super.free();
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   public InputStream getBinaryStream(long pos, long length)
/*     */     throws SQLException
/*     */   {
/* 755 */     checkFreed();
/* 756 */     if (Const.TRACE_LEVEL > 0) {
/* 757 */       DmdbLog.trace(this, "getBinaryStream(long,long)", "pos = " + pos + 
/* 758 */         ", length = " + length);
/*     */     }
/*     */     
/* 761 */     return new DmdbInputStream(this, pos, length);
/*     */   }
/*     */ }


/* Location:              D:\Program Files\DBMS_20150813\jdbc\Dm7JdbcDriver17.jar!\dm\jdbc\driver\DmdbBlob.class
 * Java compiler version: 2 (46.0)
 * JD-Core Version:       0.7.1
 */